package com.ainiyar.springweb.common.result;

import com.ainiyar.springweb.common.constant.ResultResponseConstant;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**************************************
 * File Name : ResultResponse
 * Created with : IntelliJ IDEA.
 * Author : 艾尼亚尔·毛拉吾提
 * QQ : 524155792  WeChat : ainiyar0124
 * Created Time : 2024/2/4  12:45
 * Desc :
 ***************************************/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResultResponse<T> {
    private int code; //当前请求响应状态码  如:200,400等等
    private int status;//响应是否成功 0:成功 -1:失败
    private T data; //具体数据
    private String message;//当前响应消息


    public ResultResponse(T data, int code, int status, String message) {
        this.code = code;
        this.status = status;
        this.data = data;
        this.message = message;
    }

    public ResultResponse(T data, int status, String message) {
        this.status = status;
        this.data = data;
        this.message = message;
    }

    public ResultResponse(int code, int status, String message) {
        this.code = code;
        this.status = status;
        this.message = message;
    }

    /**
     * 返回结果(需要传返回的数据、当前请求响应状态码、响应状态和当前响应消息)
     *
     * @param data    返回的数据
     * @param code    当前请求响应状态码 如:200,400等等
     * @param status  响应是否成功 0:成功 -1:失败
     * @param message 当前响应消息
     * @param <T>     泛型
     */
    public static <T> ResultResponse<T> Result(T data, int code, int status, String message) {
        return new ResultResponse<T>(data, code, status, message);
    }

    /**
     * 返回结果(需要传返回的数据、响应状态和当前响应消息)
     *
     * @param data    返回的数据
     * @param status  响应是否成功 0:成功 -1:失败
     * @param message 当前响应消息
     * @param <T>     泛型
     */
    public static <T> ResultResponse<T> Result(T data, int status, String message) {
        return new ResultResponse<T>(data, status, message);
    }

    /**
     * 返回结果(需要传返回的数据)
     *
     * @param data 返回的数据
     * @param <T>  泛型
     */
    public static <T> ResultResponse<T> Result(T data) {
        return new ResultResponse<T>(data, ResultResponseConstant.SUCCESS_CODE, ResultResponseConstant.SUCCESS_STATUS, ResultResponseConstant.SUCCESS_MESSAGE);
    }

    /**
     * 返回结果需要传返回的数据和当前响应消息)
     *
     * @param data    返回的数据
     * @param message 当前响应消息
     * @param <T>     泛型
     */
    public static <T> ResultResponse<T> Result(T data, String message) {
        return new ResultResponse<T>(data, ResultResponseConstant.SUCCESS_CODE, ResultResponseConstant.SUCCESS_STATUS, message);
    }

    /**
     * 操作成功
     *
     * @param <T> 泛型
     */
    public static <T> ResultResponse<T> Success() {
        return new ResultResponse<T>(ResultResponseConstant.SUCCESS_CODE, ResultResponseConstant.SUCCESS_STATUS, ResultResponseConstant.SUCCESS_MESSAGE);
    }

    /**
     * 操作成功(需要传响应消息内容)
     *
     * @param message 当前响应消息
     * @param <T>     泛型
     */
    public static <T> ResultResponse<T> Success(String message) {
        return new ResultResponse<T>(ResultResponseConstant.SUCCESS_CODE, ResultResponseConstant.SUCCESS_STATUS, message);
    }

    /**
     * 操作成功(需要传响应消息内容和当前请求响应状态码)
     *
     * @param message 当前响应消息
     * @param code    当前请求响应状态码  如：200,204等等
     * @param <T>     泛型
     */
    public static <T> ResultResponse<T> Success(String message, int code) {
        return new ResultResponse<T>(code, ResultResponseConstant.SUCCESS_STATUS, message);
    }

    /**
     * 操作失败
     *
     * @param <T> 泛型
     */
    public static <T> ResultResponse<T> Fail() {
        return new ResultResponse<T>(ResultResponseConstant.ERROR_CODE, ResultResponseConstant.ERROR_STATUS, ResultResponseConstant.ERROR_MESSAGE);
    }

    /**
     * 操作失败(需要传当前响应消息)
     *
     * @param message 当前响应消息
     * @param <T>     泛型
     */
    public static <T> ResultResponse<T> Fail(String message) {
        return new ResultResponse<T>(ResultResponseConstant.ERROR_CODE, ResultResponseConstant.ERROR_STATUS, message);
    }

    /**
     * 操作失败(需要传当前响应消息和当前请求响应状态码)
     *
     * @param message 当前响应消息
     * @param code    当前请求响应状态码  如：400,500等等
     * @param <T>     泛型
     */
    public static <T> ResultResponse<T> Fail(String message, int code) {
        return new ResultResponse<T>(code, ResultResponseConstant.ERROR_STATUS, message);
    }

    /**
     * 分页数据列表
     *
     * @param list      数据列表
     * @param page      页码
     * @param pageSize  每页显示数量
     * @param total     数据总数量
     * @param totalPage 总页数
     * @param <T>       泛型
     */
    public static <T> ResultResponse<Object> pageList(T list, long page, long pageSize, long total, long totalPage) {
        PageList<Object> result_data = new PageList<>((Object) list, page, pageSize, total, totalPage);
        return ResultResponse.Result(result_data);
    }

    @Data
    public static class PageList<T> {
        //分页数据
        private T list; //数据列表
        private long page; //页码
        private long pageSize;//每页显示数量
        private long total;    //数据总数量
        private long totalPage; //总页数

        public PageList(T list, long page, long pageSize, long total, long totalPage) {
            this.list = list;
            this.page = page;
            this.pageSize = pageSize;
            this.total = total;
            this.totalPage = totalPage;
        }
    }
}
